package com.water.quality.testing.utils;


import com.water.quality.testing.dao.ObservationPoint;
import com.water.quality.testing.dao.WaterData;
import com.water.quality.testing.mapper.ObservationPointMapper;
import com.water.quality.testing.service.ObservationPointService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.Random;

/**
 * 数据模拟生成工具类
 */
@Component
@RequiredArgsConstructor
public class WaterDataGenerator {
    private final ObservationPointMapper observationPointMapper;

    // 创建一个随机数生成器实例
    private final Random random = new Random();
    // 用于控制波动方向的标志位，初始值为 true 表示增加
    private boolean increase = true;

    public WaterData generateNewData(Long observationPointId, WaterData lastData) {
        // 从数据库中查询指定的观测点信息
        ObservationPoint observationPoint = observationPointMapper.selectById(observationPointId);
        // 根据上一次的数据生成新的清晰度数值，如果没有上一次的数据，则默认值为 5.0
        double clarity = generateRandomValue(lastData != null ? lastData.getClarity() : 5.0, 1.0, 0.0, 10.0);
        // 根据上一次的数据生成新的 pH 值，如果没有上一次的数据，则默认值为 7.0
        double pH = generateRandomValue(lastData != null ? lastData.getPH() : 7.0, 0.5, 0.0, 14.0);
        // 根据上一次的数据生成新的颗粒大小数值，如果没有上一次的数据，则默认值为 150.0
        double particleSize = generateRandomValue(lastData != null ? lastData.getParticleSize() : 150.0, 10.0, 0.0, 300.0);
        // 根据上一次的数据生成新的电导率数值，如果没有上一次的数据，则默认值为 1000.0
        double conductivity = generateRandomValue(lastData != null ? lastData.getConductivity() : 1000.0, 100.0, 0.0, 2000.0);
        // 根据上一次的数据生成新的温度数值，如果没有上一次的数据，则默认值为 20.0
        double temperature = generateRandomValue(lastData != null ? lastData.getTemperature() : 20.0, 2.0, 0.0, 35.0);
        // 创建一个新的 WaterData 实例，包含新的数据和观测点的信息
        WaterData newData = new WaterData(clarity, pH, particleSize, conductivity, temperature, observationPointId, observationPoint.getName());
        // 如果存在上一次的数据，计算并设置新旧数据之间的变化量
        if (lastData != null) {
            newData.setClarityChange(clarity - lastData.getClarity());
            newData.setPHChange(pH - lastData.getPH());
            newData.setParticleSizeChange(particleSize - lastData.getParticleSize());
            newData.setConductivityChange(conductivity - lastData.getConductivity());
            newData.setTemperatureChange(temperature - lastData.getTemperature());
        }
        // 返回新生成的水数据记录
        return newData;
    }

    private double generateRandomValue(double currentValue, double maxChange, double minValue, double maxValue) {
        // 生成一个随机的变化量，范围从 0 到 maxChange
        double change = random.nextDouble() * maxChange;
        // 根据 increase 标志位决定是增加还是减少当前值
        if (increase) {
            currentValue += change;
        } else {
            currentValue -= change;
        }

        // 确保数值在合理范围内
        if (currentValue < minValue) {
            currentValue = minValue;
        } else if (currentValue > maxValue) {
            currentValue = maxValue;
        }

        // 以50%的概率改变波动方向
        if (random.nextDouble() > 0.5) {
            increase = !increase;
        }
        // 返回调整后的当前值
        return currentValue;
    }
}


